package com.ref.demo9;

import java.lang.reflect.Constructor;
import java.lang.reflect.Field;
import java.lang.reflect.Method;

/**
 *@ClassName StudentTest
 *@Description 使用反射，创建一个学生类型的数组，存放二个学生，循环遍历输出，要求如下：
 *     1、第一个学生要求使用默认构造方法实例化并使用用 set 方法初始化对象
 *     2、第二个学生要求使用下面的构造方法实例化对象
 *         Student(String name,int age,Double score)
 *@Author Kx
 *@Date 2025/3/19 9:41
 *@Version 1.0
 */
public class StudentTest {
    public static void main(String[] args) {
        // 创建一个学生类型的数组，存放二个学生
        Student[] students = new Student[2];

        // 使用反射获取 Student 类的 class 对象
        Class<?> aClass = Student.class;

        try {
            // 获取 Student 类的默认构造方法
            Constructor<?> constructor1 = aClass.getConstructor();

            // 第一个学生使用默认构造方法实例化并使用 set 方法初始化对象
            students[0] = (Student) constructor1.newInstance();

            // 获取 Student 类的所有属性
            Field nameField = aClass.getDeclaredField("name");
            Field ageField = aClass.getDeclaredField("age");
            Field scroeField = aClass.getDeclaredField("score");

            // 设置属性的可访问性
            nameField.setAccessible(true);
            ageField.setAccessible(true);
            scroeField.setAccessible(true);

            // 设置属性的值
            nameField.set(students[0], "Kx");
            ageField.set(students[0], 18);
            scroeField.set(students[0], 100.0);

            // 获取 Student 类的带参构造方法
            Constructor<?> constructor2 = aClass.getConstructor(String.class, int.class, double.class);

            // 第二个学生使用带参构造方法实例化对象
            students[1] = (Student) constructor2.newInstance("Kx", 18, 100.0);

            // 循环遍历输出学生
            for (Student student : students) {
                System.out.println(student);
            }

        } catch (Exception e) {
            e.printStackTrace();
        }
    }
}
